from pyasn1.type import univ, namedtype, namedval, tag, constraint
from pyasn1.type import char  # 导入字符类型模块

# 1. 自定义简单类型 - 带约束的 Integer
class Age(univ.Integer):
    # 设置值约束：年龄必须在 0-150 之间
    subtypeSpec = constraint.ValueRangeConstraint(0, 150)

# 2. 自定义带标签的类型
class CustomInteger(univ.Integer):
    # 设置上下文特定标签 [1]
    tagSet = univ.Integer.tagSet.tagImplicitly(
        tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)
    )

# 3. 自定义字符串类型
class CustomString(char.PrintableString):  # 修正：从 char 模块导入
    # 设置长度约束：必须至少 3 个字符，最多 20 个字符
    subtypeSpec = constraint.ValueSizeConstraint(3, 20)

# 4. 自定义枚举类型
class Weekday(univ.Enumerated):
    namedValues = namedval.NamedValues(
        ('Monday', 1),
        ('Tuesday', 2),
        ('Wednesday', 3),
        ('Thursday', 4),
        ('Friday', 5),
        ('Saturday', 6),
        ('Sunday', 7)
    )
    # 设置值约束
    subtypeSpec = constraint.SingleValueConstraint(1, 2, 3, 4, 5, 6, 7)

# 5. 自定义其他字符串类型示例
class CustomIA5String(char.IA5String):  # 从 char 模块导入
    # IA5String 用于 ASCII 字符
    subtypeSpec = constraint.ValueSizeConstraint(1, 100)

class CustomUTF8String(char.UTF8String):  # 从 char 模块导入
    # UTF8String 用于 Unicode 字符
    subtypeSpec = constraint.ValueSizeConstraint(1, 100)

# 使用示例
age = Age(30)  # 创建一个年龄对象
custom_int = CustomInteger(42)  # 创建一个带标签的整数
custom_str = CustomString('Hello')  # 创建一个带约束的字符串
weekday = Weekday('Wednesday')  # 创建一个枚举值
ia5_str = CustomIA5String('ASCII Text')  # 创建 IA5 字符串
utf8_str = CustomUTF8String('你好，世界')  # 创建 UTF-8 字符串